package com.xbai.spark.core

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

/**
  * RDD 只支持粗粒度转换，即在大量记录上执行的单个操作。
  * 将创建 RDD 的一系列 Lineage（血统）记录下来，以便恢复丢失的分区。
  * RDD 的 Lineage 会记录 RDD 的元数据信息和转换行为，当该RDD 的部分分区数据丢失时，它可以根据这些信息来重新运算和恢复丢失的数据分区。
  *
  * RDD和它依赖的父RDD（s）的关系有两种不同的类型，即窄依赖（narrow dependency）和宽依赖（wide dependency）。
  * 窄依赖指的是每一个父 RDD 的 Partition 最多被子 RDD 的一个 Partition 使用, 窄依赖我们形象的比喻为独生子女
  * 宽依赖指的是多个子 RDD 的 Partition 会依赖同一个父 RDD 的 Partition，会引起 shuffle , 总结：宽依赖我们形象的比喻为超生
  * @author xbai
  * @Date 2021/1/2
  */
object Spark_Lineage {

  def main(args: Array[String]): Unit = {
    val conf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("Lineage")
    val sc = new SparkContext(conf)

    val rdd: RDD[Int] = sc.makeRDD(1 to 10, 2)
    val wordAndOne: RDD[(Int, Int)] = rdd.map((_, 1))
    val wordAndCount: RDD[(Int, Int)] = wordAndOne.reduceByKey(_ + _)
    println(wordAndOne.toDebugString)
    println(wordAndOne.dependencies.mkString(","))
    println(wordAndCount.toDebugString)
    println(wordAndCount.dependencies.mkString(","))
    sc.stop()
  }
}
